home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / arexx / ole1v10a.lha / OLE_System / modules / fw3 / AlignObjects.fw next >
Encoding:
Text File  |  1995-02-10  |  7.7 KB  |  427 lines

  1. /*
  2.  * AlignObjects.fw
  3.  *
  4.  * USAGE: AlignObjects.fw
  5.  *
  6.  * Add a powerfull function to FinalWriter
  7.  *
  8.  * HISTORY:
  9.  * v1.01    added "ICONIFY"
  10.  *
  11.  * v1.02    aligned with the new server design v1.10
  12.  *
  13.  * v1.03    fixed for the Release 3 of FinalWriter
  14.  *
  15.  * $(C): (1994, Rocco Coluccelli, Bologna)
  16.  * $VER: AlignObjects.fw 1.03 (07.Feb.1995)
  17.  */
  18.  
  19. OPTIONS RESULTS
  20.  
  21. PARSE ARG oleclip
  22. PARSE VALUE GETCLIP(oleclip) WITH jobID modID box.left box.top char.w char.h olewin oleport olehost . userport . locale config .
  23.  
  24. ADDRESS VALUE userport
  25. SetMeasure "MICROPOINTS"
  26.  
  27. ADDRESS VALUE oleport
  28.  
  29.     align. = 0
  30.     obj_lock = 0; lock. = GetLocale(1); lock.0 = GetLocale(2)
  31.  
  32.     /*
  33.      *    these remember the last kind of alignement for radio buttons
  34.      */
  35.     n.horz = 0; n.vert = 0
  36.  
  37. IF OPENPORT(olehost) == NULL() THEN DO
  38.     ERROR jobID modID 1 olehost
  39.     SETJOB jobID 'end'
  40.     EXIT 10
  41.     END
  42.  
  43. st = GUIGads()
  44. DO UNTIL st = 'end'
  45.  
  46.     CALL WAITPKT(olehost)
  47.     pkt = GETPKT(olehost)
  48.  
  49.     IF pkt == NULL() THEN ITERATE
  50.  
  51.     PARSE VALUE GETARG(pkt) WITH cmd argv
  52.     PARSE VALUE GETARG(pkt,1) WITH n0 .
  53.  
  54.     SELECT
  55.  
  56.         /*
  57.          *    align.horz = (1 left  2 center  3 right)
  58.          *    align.vert = (1 up    2 center  3 down)
  59.          */
  60.         WHEN cmd = 'ALIGN' THEN DO
  61.             PARSE VAR argv a1 a2 .
  62.  
  63.             IF n.a1 > 0 THEN DO
  64.                 n1 = n.a1; g_str.n1 = 0
  65.                 CALL Gadgets(2,n1)
  66.                 END
  67.  
  68.             IF n.a1 ~= n0 THEN DO
  69.                 g_str.n0 = ~g_str.n0
  70.                 CALL Gadgets(2,n0)
  71.                 END
  72.  
  73.             align.a1 = g_str.n0 * a2
  74.             n.a1 = g_str.n0 * n0
  75.         END
  76.  
  77.         WHEN cmd = 'START' & ~(align.vert = 0 & align.horz = 0) THEN DO
  78.             ADDRESS VALUE userport
  79.             CALL Gadgets(3,n0)
  80.  
  81.             IF SelectAllObj() THEN DO
  82.                 obj_lock = ExistsLockedObj()
  83.                 CALL CalcNewPos()
  84.                 CALL ReselectObj()
  85.                 CALL Gadgets(1,nundo)
  86.                 END
  87.  
  88.             CALL Gadgets(1,n0)
  89.             ADDRESS
  90.         END
  91.  
  92.         WHEN cmd = 'UNDO' THEN DO
  93.             ADDRESS VALUE userport
  94.  
  95.             CALL UndoAlignObj()
  96.             CALL ReselectObj()
  97.             CALL Gadgets(3,nundo)
  98.  
  99.             ADDRESS
  100.         END
  101.  
  102.         WHEN cmd = 'LOCK' THEN DO
  103.  
  104.             IF obj_lock = 0 THEN DO
  105.                 ADDRESS VALUE userport
  106.                 FirstObject 'SELECTED'
  107.                 obj_lock = result
  108.                 ADDRESS
  109.                 END
  110.  
  111.             ELSE obj_lock = 0
  112.  
  113.             g_str.nlock = lock.obj_lock
  114.             CALL Gadgets(2,nlock)
  115.         END
  116.  
  117.         WHEN cmd = 'UNICONIFY' THEN
  118.             CALL Gadgets(8,1,nundo)
  119.  
  120.         WHEN cmd = 'HELP' THEN
  121.             ABOUT jobID modID 'HELP' || st
  122.  
  123.         WHEN cmd = 'QUIT' THEN st = 'end'
  124.  
  125.         OTHERWISE NOP
  126.     END
  127.  
  128.     CALL REPLY(pkt,0)
  129.  
  130. END
  131.  
  132. CALL CLOSEPORT(olehost)
  133. EXIT 0
  134.  
  135.  
  136. ExistsLockedObj:
  137.  
  138.     DO n = 1 TO obj_n
  139.         IF obj_lock = obj_id.n THEN RETURN obj_lock
  140.     END
  141.  
  142.     g_str.nlock = lock.0
  143.     CALL Gadgets(2,nlock)
  144.  
  145. RETURN 0
  146.  
  147.  
  148. /*
  149.  *    build a list of all selected objects
  150.  */
  151. SelectAllObj:
  152.  
  153.     FirstObject 'SELECTED'
  154.     IF result = 0 THEN RETURN 0
  155.  
  156.     DO n = 1 UNTIL result = 0
  157.         obj_id.n = result
  158.         NextObject obj_id.n 'SELECTED'
  159.     END
  160.  
  161.     obj_n = n
  162.  
  163.     /*
  164.      *    read data from each object
  165.      */
  166.     DO n = 1 TO obj_n
  167.         GetObjectCoords obj_id.n
  168.         PARSE VAR result page obj_x.n obj_y.n obj_w.n obj_h.n .
  169.  
  170.         GetObjectType obj_id.n
  171.         obj_t.n = result
  172.  
  173.         new_x.n = obj_x.n
  174.         IF result = 7 THEN DO
  175.             old_h.n = obj_h.n
  176.             obj_h.n = TRUNC(obj_h.n * 0.72)
  177.             new_y.n = obj_y.n - obj_h.n
  178.             END
  179.  
  180.         ELSE new_y.n = obj_y.n
  181.  
  182.     END
  183.  
  184. RETURN 1
  185.  
  186.  
  187. UndoAlignObj:
  188.     DO n = 1 TO obj_n
  189.         SetObjectCoords obj_id.n page obj_x.n obj_y.n obj_w.n obj_h.n
  190.     END
  191.     Redraw
  192. RETURN
  193.  
  194.  
  195. ReselectObj:
  196.     DO n = 1 TO obj_n
  197.         SelectObject obj_id.n 'MULTIPLE'
  198.     END
  199. RETURN
  200.  
  201.  
  202. CalcNewPos:
  203.  
  204.     IF align.vert > 0  &  obj_lock = 0 THEN DO
  205.         up = obj_y.1
  206.         IF align.vert ~= 3 THEN
  207.             DO n = 2 TO obj_n
  208.                 up = MIN(up,obj_y.n)
  209.             END
  210.  
  211.         down = 0
  212.         IF align.vert ~= 1 THEN
  213.             DO n = 1 TO obj_n
  214.                 down = MAX(down,obj_y.n + obj_h.n)
  215.             END
  216.  
  217.         midvert = (up + down) % 2
  218.         END
  219.  
  220.     IF align.horz > 0  &  obj_lock = 0 THEN DO
  221.         left = obj_x.1
  222.         IF align.horz ~= 3 THEN
  223.             DO n = 2 TO obj_n
  224.                 left = MIN(left,obj_x.n)
  225.             END
  226.  
  227.         right = 0
  228.         IF align.horz ~= 1 THEN
  229.             DO n = 1 TO obj_n
  230.                 right = MAX(right,obj_x.n + obj_w.n)
  231.             END
  232.  
  233.         midhorz = (left + right) % 2
  234.         END
  235.  
  236.     /*
  237.      *    if only one object is selected...
  238.      */
  239.     IF obj_n = 1 THEN DO
  240.         GetPageSetup 'Width' 'Height' 'Top' 'Bottom' 'Left' 'Right'
  241.         PARSE VAR result width height up bottom left right .
  242.  
  243.         midvert = (up + height - bottom) % 2
  244.         down = height - bottom
  245.         midhorz = (left + width - right) % 2
  246.         right = width - right
  247.         END
  248.  
  249.     IF obj_lock > 0 THEN DO
  250.         GetObjectCoords obj_lock
  251.         PARSE VAR result page left up width height .
  252.  
  253.         midvert = up + height % 2
  254.         down = up + height
  255.         midhorz = left + width % 2
  256.         right = left + width
  257.         END
  258.  
  259.     IF align.vert = 1 THEN
  260.         DO n = 1 TO obj_n
  261.             new_y.n = up
  262.         END
  263.     ELSE IF align.vert = 2 THEN
  264.         DO n = 1 TO obj_n
  265.             new_y.n = midvert - (obj_h.n % 2)
  266.         END
  267.     ELSE IF align.vert = 3 THEN
  268.         DO n = 1 TO obj_n
  269.             new_y.n = down - obj_h.n
  270.         END
  271.  
  272.     IF align.horz = 1 THEN
  273.         DO n = 1 TO obj_n
  274.             new_x.n = left
  275.         END
  276.     ELSE IF align.horz = 2 THEN
  277.         DO n = 1 TO obj_n
  278.             new_x.n = midhorz - (obj_w.n % 2)
  279.         END
  280.     ELSE IF align.horz = 3 THEN
  281.         DO n = 1 TO obj_n
  282.             new_x.n = right - obj_w.n
  283.         END
  284.  
  285.     /*
  286.      *    write data for all selected objects
  287.      */
  288.     DO n = 1 TO obj_n
  289.         IF obj_t.n = 7 THEN DO
  290.             new_y.n = new_y.n + obj_h.n
  291.             obj_h.n = old_h.n
  292.         END
  293.  
  294.         SetObjectCoords obj_id.n page new_x.n new_y.n obj_w.n obj_h.n
  295.     END
  296.     ReDraw
  297.  
  298. RETURN
  299.  
  300.  
  301. GetLocale: PROCEDURE EXPOSE locale
  302. ARG strID
  303.  
  304.     strID = 'þ'strID'þ'; PARSE VALUE GETCLIP(locale) WITH (strID)text'Þ'
  305.  
  306. RETURN text
  307.  
  308.  
  309. GUIGads:
  310.  
  311.     g_offx. = 2;    g_offx.1 = 0;            g_offx.3 = 2
  312.     g_offy. = 2;    g_offy.1 = char.h + 1;    g_offy.3 = 3
  313.     g_wid. = 8;                g_wid.1 = 0;            g_wid.3 = 12
  314.     g_hei. = char.h + 4;    g_hei.1 = char.h + 1;    g_hei.3 = char.h + 6
  315.     g_sx = char.w % 2;    g_sy = char.h % 4
  316.     g_onoff. = 0
  317.  
  318.     box.left = box.left + g_sx; box.top = box.top + 2 * g_sy
  319.     box.w = 24 * char.w
  320.  
  321.     n = 1; nmain = 1
  322.  
  323.     x = box.left; y = box.top
  324.     CALL IniGad(1,1,4,,GetLocale(3))
  325.     CALL IniGad(4,0,2,'ALIGN HORZ' 1 '%1' n,0)
  326.     CALL IniGad(4,0,1,'ALIGN HORZ' 2 '%1' n,0)
  327.     CALL IniGad(4,0,1,'ALIGN HORZ' 3 '%1' n,0)
  328.     y = y + g_hei.3 + 2 * g_sy
  329.     CALL IniGad(4,1,1,'ALIGN VERT' 1 '%1' n,0)
  330.     y = y + g_hei.3 + g_sy
  331.     CALL IniGad(4,1,1,'ALIGN VERT' 2 '%1' n,0)
  332.     CALL IniGad(1,0,2,,GetLocale(4))
  333.     y = y + g_hei.3 + g_sy
  334.     CALL IniGad(4,1,1,'ALIGN VERT' 3 '%1' n,0)
  335.  
  336.     y = y + g_hei.3 + 2 * g_sy
  337.     CALL IniGad(2,3,0,'HELP',GetLocale(5))
  338.     nlock = IniGad(2,1,0,'LOCK',lock.0)
  339.     CALL IniGad(2,0,0,'START %1' n,GetLocale(6))
  340.     nundo = IniGad(2,0,0,'UNDO',GetLocale(7))
  341.  
  342.     box.h = y + g_hei.2 + 2 * g_sy - box.top
  343.     WINDOW jobID modID (box.w + 2 * g_sx) (box.h + 2 * g_sy) 1 1
  344.     CALL Gadgets(4,1,nundo - 1)
  345.  
  346. RETURN nmain
  347.  
  348.  
  349. Gadgets:
  350.  
  351.     IF ARG(1) < 4 THEN
  352.         DO i = 2 TO ARG(); n = ARG(i)
  353.             IF ARG(1) ~= 1 THEN CALL DelGad(n,g_type.n)
  354.             IF ARG(1) ~= 3 THEN CALL NewGad(n,g_type.n)
  355.         END
  356.  
  357.     ELSE IF ARG(1) < 7 THEN
  358.         DO n = ARG(2) TO ARG(3)
  359.             IF ARG(1) ~= 4 THEN CALL DelGad(n,g_type.n)
  360.             IF ARG(1) ~= 6 THEN CALL NewGad(n,g_type.n)
  361.         END
  362.  
  363.     ELSE IF ARG(1) = 8 THEN
  364.         DO n = ARG(2) TO ARG(3)
  365.             IF g_onoff.n THEN CALL NewGad(n,g_type.n)
  366.         END
  367.  
  368.     ELSE DO
  369.         DO n = ARG(2) TO ARG(3)
  370.             g_onoff.n = 0
  371.             IF g_type.n ~= 1 THEN CALL RemoveGadget(olewin,GAD.n)
  372.         END
  373.         CALL SetAPen(olewin,0)
  374.         CALL RectFill(olewin,box.left,box.top,box.left + box.w,box.top + box.h)
  375.         CALL RefreshGadgets(olewin)
  376.         END
  377. RETURN
  378.  
  379.  
  380. DelGad:
  381. PARSE ARG n,t
  382.  
  383.     g_onoff.n = 0
  384.  
  385.     IF t ~= 1 THEN CALL RemoveGadget(olewin,GAD.n)
  386.  
  387.     x = g_xpos.n - g_offx.t; y = g_ypos.n - g_offy.t
  388.     CALL SetAPen(olewin,0)
  389.     CALL RectFill(olewin,x,y,x + g_len.n,y + g_hei.t)
  390.  
  391. RETURN
  392.  
  393.  
  394. NewGad:
  395. PARSE ARG n,t
  396.  
  397.     g_onoff.n = 1
  398.  
  399.     IF t = 2 THEN
  400.         CALL AddGadGet(olewin,g_xpos.n,g_ypos.n,GAD.n,g_str.n,g_msg.n)
  401.  
  402.     ELSE IF t = 4 THEN
  403.         CALL AddGadGet(olewin,g_xpos.n,g_ypos.n,GAD.n,D2C(32 + g_str.n * 183),g_msg.n)
  404.  
  405.     ELSE DO
  406.         CALL SetAPen(olewin,1)
  407.         CALL Move(olewin,g_xpos.n,g_ypos.n)
  408.         CALL Text(olewin,g_str.n)
  409.         END
  410. RETURN
  411.  
  412.  
  413. IniGad:
  414. PARSE ARG t,na,nx,g_msg.n,g_str.n
  415.  
  416.     x = x + nx * g_sx
  417.  
  418.     g_len.n = LENGTH(g_str.n) * char.w + g_wid.t
  419.  
  420.     IF na > 0 THEN x = box.left + (na - 1) * (box.w - g_len.n) % 2 + nx * g_sx
  421.  
  422.     g_xpos.n = x + g_offx.t; g_ypos.n = y + g_offy.t; g_type.n = t
  423.  
  424.     x = x + g_len.n; n = n + 1
  425.  
  426. RETURN n - 1
  427.